package edu.math.chaos.itfunc.alg;

import java.util.Random;

/**
 * Случайная величина со знаечниями 0, 1, ..., (N -1)
 * и соответствующими им вероятностями.
 *
 * User: Илья
 * Date: 09.11.13
 * Time: 18:57
 */
public class RandomQuantity {

	private double[] mesh;

	/**
	 * @param p Вектор вероятностей, соответствующий значениям 0, 1, ..., (p.length - 1)
	 */
	public RandomQuantity(double[] p) {
		if (p == null || p.length == 0) {
			throw new RuntimeException("Не задан вектор вероятностей");
		}

		double s = 0;
		for (int i = 0; i < p.length; i++) {
			if (p[i] < 0 || p[i] > 1) {
				throw new RuntimeException("Некорректное значение вроятности");
			}

			s += p[i];
		}

		if (s != 1) {
			throw new RuntimeException("Сумма вероятностей не равна единице");
		}

		mesh = new double[p.length + 1];
		mesh[0] = 0;
		mesh[mesh.length - 1] = 1;

		int count = p.length - 1;
		for (int i = 0; i < count; i++) {
			mesh[i + 1] = mesh[i] + p[i];
		}
	}

	/**
	 * @return Сгенерированное значение с.в.
	 */
	public int next() {
		double d = RANDOM.nextDouble();
		for (int i = 1; i < mesh.length; i++) {
			if (d < mesh[i]) {
				return i - 1;
			}
		}

		throw new RuntimeException("Алгоритм генерации с.в. некорректен");
	}

	private static final Random RANDOM = new Random();
}
